闲话 22.8.16

闲话

使用 Min_25 筛对着 \(10^{13}\) 的数据进行了一个跑
在 1647.647522 s 后它输出了

今天又是被dp卡住的一天呢
所以你就当我闲话的主题吧(阴笑)

好的今天是《第三心脏》!
是《幻影EP》里最早发布的歌曲呢!也是我很喜欢的一曲!

第三心脏

わたし天使でも悪魔でも無いと思うけど
我既不是天使 也不是魔鬼
心なんて他人の鏡に映ってる偽物で
心脏不过是映在他人镜子里的残像
AとBに分けられてる選択肢だって
在A和B选项之间作出的选择
右手を歩くあなたの顔色次第かもね
不过是观了走在我右手边的你的脸色

わたし少し暗くなった放課後の藍が好きだった
我喜欢放学后天空那片稍微暗淡的蓝
気の狂ったクラスルームでは何も感じないの
在发了狂的教室里什么都感觉不到
先生に見えない角度 ご両親の知らないところ
在老师看不到的角度 父母不知道的地方
心臓が隠されている
心脏被藏了起来

良い子はみんな帰り始めた
好孩子们都开始收拾回家了
カラスが鳴いた
乌鸦声声啼叫

あなたに映るわたしは
你身上映出的我
心ってもんを信じてる無邪気なレゾナンス
是深信着人心的一阵无邪的共鸣
さよならを言わないのは
没有和你道别是因为
あなたに見抜かれてしまわないように
我并不想被你看透看穿

Es…

わたし先生の前でだけ真面目ぶる子嫌なんだ
我可讨厌只在老师面前装乖的孩子了
そう言うとあなたは困り顔で俯いていた
你听了以后一脸委屈地低下了头
実際はどうでもよかった 本題は別のものだった
但其实无所谓 正题是别的事情
最低が隠されている
败絮被藏了起来

良い子はみんな大人になった
好孩子们都慢慢变成大人
夢から醒めた
从梦里醒过来

あなたと歩くわたしが
和你并肩同行的我
記憶になって遠ざかる叡智の背中
快没法清晰记起你睿智的背影
ありがとうを言わないのは
没有和你道谢是因为
どこかで嫌われてしまわないように
不想有任何机会被你讨厌

自分の悪いとこ全部知っている
对自己所有的缺点明了于心
影法師が先回りする
影子抢先一步行动

帰り道を進むたび
每当一起回家时
離れていった脆弱なわたしのイデア
分离以后脆弱的我冒出的想法
さよならを言わないのは
没有和你道别是因为
あなたが呑み込まれてしまわないように
不想你一个人被寂寞和黑暗吞噬

冷たい第三の心臓が
那颗冰冷的第三心脏
わたしたちを見つめていた
一直默默地在看着我们两人

还是想说 幻影LV 里面 把第三心脏安排在美影日记后面
这个顺序 实在是很厉害
美影日记是很舒缓的曲子,因此间章也刻意地营造出一种静谧
随后直接切入第三心脏的前奏 被惊喜到了

当时饭发第三心脏时我就在思考是不是要有新故事了
虽然但是《chimera》这专里的《命运》并没有被我纳入考虑范围内
直到在hs这边换教学楼时翻了一下饭的新专
我:wc什么玩意 命运?wc雾霭相随?那么多新歌?我又有歌要学了(

为什么Soytony总是提到那么阴间的歌啊
?

一道新式dp

\(n\) 个数字,\(3|n\)。Alice、Bob 和 Karen 想要将这些数字平分。每个人对数字都有特殊的喜好,可以以长为 \(3n\) 的排列 \(a,b,c\) 表示,数字在排列中越靠前表示对应人越喜欢这个数字。分配共分为 \(n\) 轮,每轮每个人都要同时选出还没有被拿走的糖果中自己最喜欢的。如果有大于 1 个人选了同一个糖果,他们就会产生冲突,分配就失败了。否则,他们各自拿走自己选择的糖果,开始进行下一轮的分配。如果 \(n\) 轮分配后都没有发生冲突,那么这次分配就是成功的。

Alice 和 Bob 各自知道对方的喜好,但他们不知道 Karen 的喜好。现在给出 Alice 和 Bob 的喜好,请求出有多少种可能的 Karen 的喜好使得分配成功。答案对 1e9+7 取模。

\(n \le 400\)

九条可怜(误)
image

我会 next_permutation!

略过不讲。复杂度 \(O(n \times n!)\)

我想dp!

ok这是正解思路。

我会分段转移!

50pts

我们发现每个人都只能从喜欢的数字中从前往后选择,不可能选择后面的数字后再选择前面的数字。定义一个人选择 \(i\) 位置为其选择了对应喜好排列中第 \(i\) 个位置的数字。定义 \(\text{posa}[i]\)\(a[i]\) 所在的位置 \(i\),即 \(\text{posa}[a[i]] = i\)\(\text{posb}[i]\) 同理。
我们设 \(f[i][j][k]\) 为 Alice 选择到第 \(i\) 喜欢的数字,Bob 选择到第 \(j\) 喜欢的数字,Karen 还能选择 \(k\) 个数字的方案数。
首先考虑朴素转移。我们确定一个状态 \(f[i][j][k]\),并枚举 \(i' > i\) 为 Alice 下一个选择的位置,\(j' > j\) 为 Bob 下一个选择的位置。容易发现,Karen 选择的数字即为 Alice 喜好排列中位置在 \([i+1,i'-1]\) 内且出现在 Bob 喜好排列中位置在 \([j'+1,3n]\) 中的数字,以及 Bob 喜好排列中对应的数字。
可以发现枚举并随便优化一下能做到 \(O(n^5)\)

我发现这两个东西互不相干!

80pts

Alice 和 Bob 决策之间的影响可以消除,因此可以把他们拆成两个 dp 分别计算贡献。这是这道题的独特之处。
我们设 \(f[i][j][k][0/1]\) 分别为目前考虑 Alice/Bob 的种类。转移时分别枚举 \(i'\)\(j'\) 即可。
时间复杂度 \(O(n^4)\)

既然都分开了那为啥要跳一整段呢?

100pts

我们考虑每一次不是 \(i \rightarrow i'\),而是 \(i \rightarrow i+1\)
分别讨论各种情况:

  1. \(\text{posb}[a[i]] < j\)
    这个数字无法被 Alice 选择。要么是 Bob 提前选了,要么是 Karen 选完了。
    \(f[i+1][j][k][0] = f[i][j][k][0]\)
  2. \(\text{posb}[a[i]] > j\)
    Alice 可以选择这个数。她可以选择,也可以不选,让给 Karen 选掉。
    1. 让自己选择
      这时 Bob 还没有选择,这时把舞台交给 Bob,状态转移到 \([1]\)
      \(f[i][j][k][1] = f[i][j][k][0]\)
    2. 让 Karen 选掉
      这时 Karen 能选的数字个数减少了1。转移即可。
      \(f[i+1][j][k-1][0] = f[i][j][k][0]\times k\)
  3. 这里讨论 Bob 的转移与 Alice 相同,对应转移1和转移2ii
  4. [1] 出现了不是0的情况
    由2可知这时肯定是 Alice 选择了而 Bob 还没选。这里对应转移2i。由于是本位转移,在实现时直接在后面判断一句就行
    所以 Bob 选择完后两个人的指针都必须移动
    \(f[i+1][j+1][k+1][0] = f[i][j][k][1]\)

于是我们就确定出最终 Karen 的选择序列有多少种可能了。但是这并不是 Karen 最终的喜好排列。
现在的问题是:给定一种 Karen 选择数字的顺序,有多少种 Karen 的喜好序列可以生成?

我们发现,假如把 Alice 和 Bob 选择的数字插入 Karen 的选择序列中,会构成一个 \(n\) 的排列。
倒序考虑插入的过程,我们发现 Alice 和 Bob 的数字必须插入在 Karen 所选择数字的后面,这样才能保证分配成功。
假设现在是第 \(i\) 次插入,现在的数字后面有 \(3\times (i-1)\) 个数字。Alice 需要把数字插入在这之间的 \(3 \times (i-1) + 1\) 个空隙中,有 \(3 \times (i-1) + 1\) 种可能。Alice 插入完后是 Bob。Bob 插入时有 \(3 \times (i-1) + 2\) 个空隙。
根据乘法原理,总共有

\[\prod_{i = 1}^{\frac n3} (3 \times i + 2) \times (3 \times i + 1) \]

种可能。乘入即可。

总时间复杂度 \(O(n^3)\)

代码
f[1][1][0][0] = 1;
rep(i,1,n+1) rep(j,1,n+1) rep(k,0,n / 3) {
	if (f[i][j][k][0]) {
		if (i == n+1) { if (k == 0) ans = (ans + f[i][j][k][0]) % mod; continue; }
		if (posb[a[i]] < j) f[i+1][j][k][0] = (f[i+1][j][k][0] + f[i][j][k][0]) % mod;
		else {
			f[i][j][k][1] = (f[i][j][k][1] + f[i][j][k][0]) % mod;
			if (k > 0) f[i+1][j][k-1][0] = (f[i+1][j][k-1][0] + 1ll * f[i][j][k][0] * k % mod) % mod;
	} if (f[i][j][k][1]) {
		if (posa[b[j]] < i) f[i][j+1][k][1] = (f[i][j+1][k][1] + f[i][j][k][1]) % mod;
		else if (a[i] != b[j]) {
			f[i+1][j+1][k+1][0] = (f[i+1][j+1][k+1][0] + f[i][j][k][1]) % mod;
		}
			if (k > 0) f[i][j+1][k-1][1] = (f[i][j+1][k-1][1] + 1ll * f[i][j][k][1] * k % mod) % mod;
		}
	} 
} rep(i,1,n) if (i % 3) ans = 1ll * ans * i % mod;
posted @ 2022-08-16 21:03  joke3579  阅读(103)  评论(4编辑  收藏  举报